package com.start.common.mybaitsplus;

import com.start.common.enums.StartBaseEnum;
import com.start.common.enums.StartBaseIntegerEnum;
import com.start.common.enums.StartBaseStringEnum;
import com.start.common.tools.StartEnumTools;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

@MappedTypes({Integer.class})
public class GlobalMyBaitsStartIntegerEnumTypeHandler extends BaseTypeHandler<StartBaseIntegerEnum> {
    private Class<? extends StartBaseIntegerEnum> clazz = null;

    public GlobalMyBaitsStartIntegerEnumTypeHandler(Class<? extends StartBaseIntegerEnum> clazz) {
        assert clazz != null;
        assert clazz.isEnum();
        this.clazz = clazz;
    }

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, StartBaseIntegerEnum startBaseIntegerEnum, JdbcType jdbcType) throws SQLException {
        Integer value = startBaseIntegerEnum.getValue();
        preparedStatement.setInt(i, value);
    }

    @Override
    public StartBaseIntegerEnum getNullableResult(ResultSet resultSet, String s) throws SQLException {
        if (resultSet == null) return null;
        String string = resultSet.getString(s);
        if (StringUtils.isEmpty(string)) return null;
        StartBaseEnum enumByValue = StartEnumTools.findEnumByValue(clazz, string);
        return (StartBaseIntegerEnum) enumByValue;
    }

    @Override
    public StartBaseIntegerEnum getNullableResult(ResultSet resultSet, int i) throws SQLException {
        if (resultSet == null) return null;
        String value = resultSet.getString(i);
        if (value == null || StringUtils.isEmpty(value)) return null;
        StartBaseIntegerEnum[] enumConstants = clazz.getEnumConstants();
        for (StartBaseIntegerEnum e : enumConstants) {
            if (e.getValue().equals(value)) return e;
        }
        return null;
    }

    @Override
    public StartBaseIntegerEnum getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        if (callableStatement == null) return null;
        String value = callableStatement.getString(i);
        if (value == null || StringUtils.isEmpty(value)) return null;
        StartBaseIntegerEnum[] enumConstants = clazz.getEnumConstants();
        for (StartBaseIntegerEnum e : enumConstants) {
            if (e.getValue().equals(value)) return e;
        }
        return null;
    }
}
